package com.youlei.newgraduateproject.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @Author youlei
 * @Description JWT的工具类
 * @Date 15:47 2021/5/9
 **/
//使该类拥有get set equals等方法
@Data
//注入spring容器
@Component
//从yaml文件中获取expire secret header
@ConfigurationProperties(prefix = "youlei.jwt")
public class JwtUtils {

	//token有效时长
	private long expire;
	//jwt 32位的加密密钥
	private String secret;
	//设置JWT在请求头中的名称
	private String headerName;

	// 生成jwt
	public String generateToken(String username) {

		Date nowDate = new Date();
		Date expireDate = new Date(nowDate.getTime() + 1000 * expire);

		return Jwts.builder()
				//头部
				.setHeaderParam("typ", "JWT")
				//主体
				.setSubject(username)
				//创建时间
				.setIssuedAt(nowDate)
				//过期时间,根据yaml配置文件中的设置,这里我设置了7天
				.setExpiration(expireDate)
				//设置加密算法HS512和加密密钥,同样根据yaml配置文件中的设置
				.signWith(SignatureAlgorithm.HS512, secret)
				//合成
				.compact();
	}

	// 解析jwt,为了拿到主体的内容,进行验证
	//Claims为body的实体类
	public Claims getClaimByToken(String jwt) {
		try {
			return Jwts.parser()
					.setSigningKey(secret)
					.parseClaimsJws(jwt)
					.getBody();
		} catch (Exception e) {
			return null;
		}
	}

	// 判断jwt是否过期
	public boolean isTokenExpired(Claims claims) {
		//获取过期时间将它与当前时间对比
		return claims.getExpiration().before(new Date());
	}

}
